﻿#include <iostream>
#include <future>
#include <thread>
#include <chrono>
using namespace std;
/*
2. packaged_task
在C++中，packaged_task是一个类模板
用于将一个可调用对象（如函数、函数对象或Lambda表达式）封装成一个异步操作
并返回一个std::future对象，表示异步操作的结果
packaged_task可以方便地将一个函数或可调用对象转换成一个异步操作，供其他线程使用

***一个利用future记录异步结果的function类型的对象)

简单说将函数及其调用上下文打包成一个可移动、可存储的对象
这个对象可以安全地传递给其他线程执行，同时提供了一种标准化的方式来获取异步结果

*/
int packaged(int a) {
	cout << "packaged_task" << endl;
	std::this_thread::sleep_for(std::chrono::seconds(3));
	return a;
}

int main10() {
	std::packaged_task<int()> task(bind(packaged, 10));
	future<int> f = task.get_future();
	thread(move(task)).detach();
	cout << f.get() << endl;//如果线程没结束，这里会阻塞等待
	return 0;
}